package s2elinshu;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

import s2elinshu.model.SungJuk2VO;

public class J20SungJuk {
	// 숫자를 특정형식에 맞춰 출력하는 기능
	//  NumberFormat
	//  DecimalFormat
	// format 메서드에 특정패턴(0,#)을 이용해서
	// 다양한 형식으로 숫자를 출력할 수 있음
	public static void main(String[] args) {
		ArrayList<SungJuk2VO> mdb = new ArrayList<>();
		String dfmt1 = "000.00";
		String dfmt2 = "###.##";
		String hr = "------------------------------------------";
		String newMsg1 = "새로운 성적데이터를 입력합니다.";
		String newMsg2 = "이름, 국어, 영어, 수학 순으로 입력하세요";
		String newMsg3 = "성적 등록 완료!";
		String newMsg4 = "성적 등록 실패! - 숫자만 입력하세요";
		String newMsg5 = "성적 등록 실패! - 알 수 없는 오류 발생!";
		
		String readMsg1 = "전체 성적 데이터 출력";
		String readMsg2 = "검색할 성적 데이터의 이름을 입력하세요";
		String readMsg3 = "데이터를 찾았습니다.";
		String readMsg4 = "찾는 데이터가 없습니다.";
		
		String modifyMsg1 = "기존 성적 데이터를 수정합니다.";
		String modifyMsg2 = "수정할 데이터의 이름을 입력하세요";
		String modifyMsg3 = "이름, 국어, 영어, 수학 순으로 입력하세요";
		String modifyMsg4 = "수정결과 다름과 같습니다.";
		String modifyMsg5 = "찾는 데이터가 없습니다.";

		String removeMsg1 = "특정 성적 데이터를 삭제합니다.";
		String removeMsg2 = "삭제할 데이터의 이름을 입력하세요";
		String removeMsg3 = "성공적으로 삭제되었습니다.";
		String removeMsg4 = "삭제할 데이터를 찾지 못했습니다.";

		
		// 정적 배열은 만들기 전에 몇 건이 저장되어야 할 지 정해야 하는데
		// 동적 배열은 저장공간이 늘어나기 때문에 상관 없음


		Scanner sc = new Scanner(System.in);
		SungJuk2VO sj = null;
		System.out.println(newMsg1);
		System.out.println(newMsg2);

		try {
			String name = sc.next();
			int kor = sc.nextInt();
			int eng = sc.nextInt();
			int mat = sc.nextInt();
			

			// 스캔 받은 데이터를 저장
			sj = new SungJuk2VO(name, kor, eng, mat);
            sj.setTot(sj.getKor()+sj.getEng()+sj.getMat());
            DecimalFormat df = new DecimalFormat(dfmt1);
            String avg = df.format((double)sj.getTot()/3);
            sj.setAvg(Double.parseDouble(avg));                      
            switch((int)sj.getAvg()/10){
            case 10 : case 9: sj.setGrd('수'); break;
            case 8 :                  sj.setGrd('우'); break;            
            case 7 :                  sj.setGrd('미'); break;            
            case 6 :                  sj.setGrd('양'); break;            
            default :               sj.setGrd('가');
            };
            
            
			// ArrayList에 데이터 추가!
			mdb.add(sj);

			// 오류 메시지
			System.out.println(newMsg3);
		} // try

		catch (InputMismatchException ime) {
			sj = null; // 객체 제거
			System.out.println(newMsg4);
		}

		catch (Exception e) {
			sj = null; // 객체 제거
			e.printStackTrace(); // 자세한 오류 내용 출력
			System.out.println(newMsg5);
		}
		System.out.println(hr);
		System.out.println(readMsg1);
		
		// CRUD
		// 성적 데이터 입력 created
		StringBuilder sb = new StringBuilder();
		for (SungJuk2VO s : mdb) {
			sb.append(s.toString()).append("\n");		}
		System.out.println(sb);
		System.out.println(hr);
		
		
		
		
		// 성적 데이터 조회 retrieve
		System.out.println(readMsg2);
		String key = sc.next();  // 이름 입력받음(조건)
	    SungJuk2VO findOne = null;
		for(SungJuk2VO s:mdb){
			if(s.getName().contains(key)){
				findOne = s;  // 검색도 데이터를 findOut에 저장
		     break;
			} // if
		}  // for each문
		if(findOne != null){
			System.out.println(readMsg3);
			System.out.println(findOne);
		}else{
			System.out.println(readMsg4);
		}
		System.out.println(hr);
		
		
		
		
		// 성적 데이터 수정 update
		// 다시 총점/평균/학점 계산
		System.out.println(modifyMsg1);
		System.out.println(modifyMsg2);
		key = sc.next();
		//ArrayList에 값을 추가할 때 add, 값을 수정할 때 set
        findOne = null;    // 수정할 데이터 위치
        int position = 0;   // 검색 위치
		for(SungJuk2VO s:mdb){
			if(s.getName().equals(key)){
				findOne = s; break;
			}  // if
			++position;
		}  // for
		if(findOne != null){
		    System.out.println(findOne);
			System.out.println(modifyMsg3);
			findOne = new SungJuk2VO(sc.next(),sc.nextInt(),sc.nextInt(),sc.nextInt());
			
            findOne.setTot(findOne.getKor()+findOne.getEng()+findOne.getMat());
            
            DecimalFormat df = new DecimalFormat(dfmt1);
            String avg = df.format((double)findOne.getTot()/3);
            findOne.setAvg(Double.parseDouble(avg));                      
            switch((int)findOne.getAvg()/10){
            case 10 : case 9: findOne.setGrd('수'); break;
            case 8 :                  findOne.setGrd('우'); break;            
            case 7 :                  findOne.setGrd('미'); break;            
            case 6 :                  findOne.setGrd('양'); break;            
            default :               findOne.setGrd('가');
            };
            // 수정된 입력값들을 
            // ArrayList mdb에 입력
            mdb.set(position,findOne);
            System.out.println(modifyMsg4);
            System.out.println(mdb.get(position));
		}
		else{
			System.out.println(modifyMsg5);
		}
		System.out.println(hr);
		
		
		
		// 성적 데이터 삭제 delete
		System.out.println(removeMsg1);
		System.out.println(removeMsg2);
		
		key = sc.next();
		boolean findOk = false;
		position = 0;
		
		for(int i = 0;i<mdb.size();++i ){  // *
			SungJuk2VO s = mdb.get(i);
			if(s.getName().equals(key)){
				findOk = true;
				position = i; break;  // *
			}  // if
		}  // for
		if(findOk){  // findOk == true라고 써고 되고 findOk만 써도 됨
			mdb.remove(position);
			System.out.println(removeMsg3);
			sb = new StringBuilder();
			for(SungJuk2VO s:mdb){
				sb.append(s.toString()).append("\n");
			}
			System.out.println(sb);
		}
		else{
			System.out.println(removeMsg4);
		}
		
		sc.close();

	} // public static void main
} // public class J20SungJuk
